package com.alax.interfaces.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;


public interface DashboardMapper {

    /**
     * 统计指定时间段内的总调用次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 总次数
     */
    Long countCallsBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 统计指定时间段内去重的用户ID数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户数
     */
    Long countDistinctUsersBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 统计指定时间段内特定状态的调用次数
     * @param status 状态 (e.g., 0 for fail, 1 for success)
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 次数
     */
    Long countCallsWithStatusBetween(@Param("status") int status, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 获取指定时间段内每日的调用总数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return List of Maps, e.g., [{"call_date": "2024-04-24", "count": 100}, ...]
     */
    List<Map<String, Object>> getDailyCallCountsBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 获取指定时间段内按状态分组的调用次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return List of Maps, e.g., [{"status": 1, "count": 1000}, {"status": 0, "count": 50}]
     */
    List<Map<String, Object>> getCallStatusCountsBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 获取指定时间段内调用次数最多的Top N API ID及其调用次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return List of Maps, e.g., [{"api_id": 123, "count": 1500}, ...]
     */
    List<Map<String, Object>> getTopCalledApisBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("limit") int limit);

    // 获取实时统计数据
    List<Map<String, Object>> getRealtimeStats();
    
    // 获取实时统计汇总
    Map<String, Object> getRealtimeSummary();
    
    // 获取响应时间统计
    List<Map<String, Object>> getResponseTimeStats(
        @Param("startTime") LocalDateTime startTime,
        @Param("apiId") Long apiId);
    
    // 获取错误统计
    List<Map<String, Object>> getErrorStats(
        @Param("startTime") LocalDateTime startTime);
    
    // 获取用户行为统计
    List<Map<String, Object>> getUserBehaviorStats(
        @Param("startTime") LocalDateTime startTime,
        @Param("userId") Long userId);

}